package gestorvideoclub.jdbc;
import gestorvideoclub.Franquicia;
import gestorvideoclub.Pelicula;
import gestorvideoclub.Producto;
import gestorvideoclub.Proveedor;
import gestorvideoclub.Tarifa;
import gestorvideoclub.Ubicacion;
import gestorvideoclub.Proveedor;
import gestorvideoclub.Tarifa;
import gestorvideoclub.Videojuego;
import gestorvideoclub.enumeraciones.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class ProductoJDBC {

    public static int obtenerTipoProductoPorId(Producto producto) {
        int id = -1;
        String sql = "select * from productos where codigo = " + producto.getCodigo();
        sql += " and titulo = '" + producto.getTitulo() + "' and tipoProducto = '" + producto.getTipo() + "'";

        //System.out.println(sql);

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            if(rs.next()){
                id = rs.getInt("Id");
            }
            
        } catch (Exception e) {
            System.out.println("Error al obtener un producto " + e.getMessage());
        }

        AccesoDatos.cerrarConexion(con);
        return id;
    }


    /**
     *Este método se utilizará únicamente para cambiar el estado del producto
     * @param producto es el producto al que se le va a cambiar el estado
     */
    public static void modificarProducto(Producto producto){
        String sql = "update productos set estadoProducto = '" + producto.getEstado() + "' where Id = " + producto.getId();
        Connection con = null;
        Statement st = null;
        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
        } catch (Exception e) {
            System.out.println("Error al modificar el estado del producto " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
    }


    public static TipoProductoEnum obtenerTipoProductoPorId(int idProducto) {
        TipoProductoEnum tipo = null;
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        String sql = "select tipoProducto from productos where Id =" + idProducto;

        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            rs.next();
            tipo = tipo.valueOf(rs.getString("tipoProducto"));
            rs.close();
            st.close();
        } catch (Exception e) {
            System.out.println("Error al obtener el tipo del producto " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return tipo;
    }

   
    //RAFA BERRAL
    public static int compruebaCodigo(int cod) {
        int aux = 0;
        String sql = "select COUNT(codigo) AS tamano from productos where productos.codigo=" + cod;
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                aux = rs.getInt("tamano");//nos guarda el entero que nos devuelve la consulta
            }
            AccesoDatos.cerrarConexion(con);
        } catch (Exception e) {
            System.out.println("Error al comprobar codigo de Producto " + e.getMessage());
        }
        return aux;
    }
        
     /**
      * Devuelve Tarifa que tiene asignada una pelicula
      * 
      * @param codigo       codigo de la pelicula
      * 
      */
     public static Tarifa devuelveTarifa(int codigo){
        String sql = "select * from productos, tarifas where productos.codigo="+codigo+ " AND tarifas.Id=productos.id_tarifa";
        int IdTar;
        String nombreTar;
        Date fechaIniTar,fechaFinTar;
        Float precioTar;
        TipoProductoEnum tipoProdTar;
        Tarifa tarifa=null;
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                IdTar = rs.getInt("tarifas.Id");
                nombreTar = rs.getString("tarifas.nombre");
                tipoProdTar = TipoProductoEnum.valueOf(rs.getString("tarifas.tipoProducto"));
                precioTar = rs.getFloat("tarifas.precio");
                fechaFinTar = rs.getDate("tarifas.fechaFin");
                fechaIniTar = rs.getDate("tarifas.fechaInicio");
                tarifa = new Tarifa(nombreTar, tipoProdTar, precioTar, fechaIniTar, fechaFinTar);
                tarifa.setId(IdTar);//guardamos idTarifa, ya que en el constructor no inicializamos idTarifa
            }
        } catch (Exception e) {
            System.out.println("Error a obtener la Tarifa " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return tarifa;
     }
     
      /**
      * Devuelve Proveedor que tiene asignado una pelicula
      * 
      * @param codigo       codigo de la pelicula
      * 
      */
     public static Proveedor devuelveProveedor(int codigo){
       Proveedor proveedor= null;
       int idProv;
       String domicilioProv,nombreProv,cifProv,ProvinciaProv,cpProv,telefProv,estadoProv;
        String sql = "select * from productos, proveedores where productos.codigo="+codigo+ " AND proveedores.Id=productos.id_proveedor";
       Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
               idProv = rs.getInt("proveedores.Id");
               domicilioProv = rs.getString("proveedores.domicilioFiscal");
               nombreProv = rs.getString("proveedores.nombreEmpresa");
               cifProv = rs.getString("proveedores.cif");
               ProvinciaProv = rs.getString("proveedores.provincia");
               cpProv = rs.getString("proveedores.cp");
               telefProv = rs.getString("proveedores.telefono");
               estadoProv = rs.getString("proveedores.estadoProveedor");
               proveedor = new Proveedor(nombreProv, cifProv, domicilioProv,ProvinciaProv,telefProv, cpProv,estadoProv);
               proveedor.setIdProveedor(idProv);//guardamos idProveedor en objeto Proveedor
            }
        } catch (Exception e) {
            System.out.println("Error a obtener el Proveedor " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return proveedor;
     }
     
      /**
      * Devuelve Franquicia que tiene asignada una pelicula
      * 
      * @param codigo       codigo de la pelicula
      * 
      */
     public static Franquicia devuelveFranquicia(int codigo){
           String sql = "select * from productos, franquicia where productos.codigo="+codigo+ " AND franquicia.Id=productos.id_franquicia";
           Franquicia franquicia = null;
           int idFranq;
           String nombFranq, dirFranq,cifFranq,telFranq;
           EstadoFranquicia estadoFranq;
           Connection con = null;
           try {
                con = AccesoDatos.getConexion();
                Statement st = con.createStatement();
                ResultSet rs = st.executeQuery(sql);
                while (rs.next()) {
                   idFranq = rs.getInt("franquicia.Id");
                   estadoFranq = EstadoFranquicia.valueOf(rs.getString("franquicia.estadoFranquicia"));
                   nombFranq = rs.getString("franquicia.nombre");
                   dirFranq = rs.getString("franquicia.direccion");
                   cifFranq = rs.getString("franquicia.cif");
                   telFranq = rs.getString("franquicia.telefono");
                   franquicia = new Franquicia(nombFranq, dirFranq, cifFranq, telFranq);
                   franquicia.setId(idFranq);
                   franquicia.setEstado(estadoFranq);//actualizamos estado, ya que en el constructor se le da de "ALTA" por defecto
                }
            } catch (Exception e) {
            System.out.println("Error a obtener la Franquicia " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
         
         return franquicia;
     }
     
      /**
      * Devuelve Ubicacion que tiene asignada una pelicula
      * 
      * @param codigo       codigo de la pelicula
      * 
      */
     public static Ubicacion devuelveUbicacion(int codigo){
        String sql = "select * from productos, ubicaciones where productos.codigo="+codigo+ " AND ubicaciones.Id=productos.id_ubicacion";
        Ubicacion ubicacion= null;
        int idUbic,fila,columna;
        boolean ocupado=false;
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) 
            {
                idUbic = rs.getInt("ubicaciones.Id");
                fila = rs.getInt("ubicaciones.fila");
                columna = rs.getInt("ubicaciones.columna");
                ocupado = rs.getBoolean("ubicaciones.ocupado");
                ubicacion = new Ubicacion(fila,columna,ocupado);
                ubicacion.setId(idUbic);//guardamos idUbicacion en Objeto Ubicacion
            }
        } catch (Exception e) {
            System.out.println("Error a obtener la Ubicacion " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return ubicacion;
     }
     /*
      * metodo que utilizaremos para introducir de forma interna el codigo del producto
      */
     public static int devuelveUltimoId(){
         int id=0;
         String sql ="select * from productos order by Id";
         Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) 
            {
               id = rs.getInt("productos.id");
            }
        } catch (Exception e) {
            System.out.println("Error a obtener id de ultima pelicula " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return id+1;//le sumamos uno, que sera la siguiente posicion en la que añadimos el producto
     }

     /*
    * metodo de que obtiene el numero de productos que hay en la tienda.
    */
    public static void consultaProductosTienda(){
       int tam=0;
       List<Pelicula> listaP = new ArrayList();
       List<Videojuego> listaV = new ArrayList();
       List<Producto> listaProducto = new ArrayList();
       listaP = PeliculaJDBC.consultaPeliculas();
       listaV = VideojuegoJDBC.consultaVideojuegos();
       //añadimos las a listaProducto tanto peliculas como Videojuegos
       listaProducto.addAll(listaP);
       listaProducto.addAll(listaV);
       //recorremos lista y comprobamos que el producto contenga la id_ubicacion
       //correspondiente a Tienda -->  id_ubicacion=1
       for(Producto p: listaProducto){
           if(p.getUbicacion().getId()==1)
               tam++;
       }
       System.out.println("Productos en Tienda: "+tam);
   }  
    /*
     * metodo que que dice el numero de productos que hay en el cajero
     */
    public static void consultaProductosCajero(){
        System.out.println("Productos en Cajero: "+UbicacionJDBC.consultaUbicacionesCajero());
    }

    
}
